// 给定一个循环数组（最后一个元素的下一个元素是数组的第一个元素），输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序，这个数字之后的第一个比它更大的数，这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1。
// 思路，单调栈 + 循环数组
// 循环数组可以通过索引对数组长度取余来模拟

function nextGreaterElements(nums) {
    let result = new Array(nums.length).fill(-1)
    let stack = [0]
    for (let i = 0; i < 2 * nums.length; i++) {
        while (stack.length && nums[i % nums.length] > nums[stack[0]]) {
            let index = stack.shift()
            result[index] = nums[i % nums.length]
        }        
        stack.unshift(i % nums.length)
    }
    return result
}

nums = [1,2,3,4,3]
console.log(nextGreaterElements(nums))